package com.woniu.inlet.web.interceptor;


import com.alibaba.fastjson.JSON;
import com.woniu.utils.AdminPass;
import com.woniu.utils.JwtTokenUtil;
import com.woniu.utils.LoginPass;
import com.woniu.utils.ResultResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * 身份验证拦截器
 */
@Component
@Slf4j
@Order(-100)
public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        log.debug("请求路径为{}", uri);
        /**
         * 当前请求触发的、请求的不是 Controller 中的方法，
         * 而是 jsp、thymeleaf 这样的静态资源，或者 .css、.html、.js 这样的静态资源，就无条件放行。
         */
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        if (uri.indexOf("swagger") != -1) {
            return true;
        }

        String token = "";

        //得到请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        if (parameterMap.size() > 0)
            for (String s : parameterMap.keySet()) {
                if (s.equals("token")) {
                    token = parameterMap.get(s)[0];
                }
                String[] x = parameterMap.get(s);
                log.debug("参数为{}，值为{}", s, x[0]);
                if ("null".equals(x[0]) || x[0].trim().length() == 0) {
                    responseMsg(response, "参数值不能为空");
                    return false;
                }
            }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        log.debug("请求的方法为{}", handlerMethod);

        //得到请求头
        //String token = request.getHeader("token");
        String tokenCheck = "";
        if (token.length() != 0) {
            tokenCheck = JwtTokenUtil.getAdmin(token);
            if (tokenCheck.equals("token非法")) {
                responseMsg(response, "非法登录");
                return false;
            }
        }

        // 判断本次请求所触发的那个请求处理方法的脑袋上面有没有 @Xxx 注解。
        if (method.isAnnotationPresent(LoginPass.class)) {
            // @LoginPass 意味着只有登录用户才能访问。
            if (!tokenCheck.equals("token非法")) {
                return true;
            }
            responseMsg(response, "请登录");
            return false;
        }


        if (method.isAnnotationPresent(AdminPass.class)) {
            // @AdminPass 只有管理员才能访问（细分角色，解析token，获取角色）
            if (!tokenCheck.equals("token非法") && !tokenCheck.equals("user")) {
                return true;
            } else {
                responseMsg(response, "管理员才能访问");
                return false;
            }
        }

        return true;
    }

    /**
     * 响应信息给页面
     */
    public static void responseMsg(HttpServletResponse response, Object obj) {
        response.setContentType("application/json;charset=utf-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.print(JSON.toJSON(new ResultResponseUtil<>(500, "ok", obj)));
        writer.close();
        try {
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
